package com.springapp.service.impl;

import com.springapp.connexion.SessionBean;
import com.springapp.dao.dao.impl.EmplacementDAO;
import com.springapp.dao.dao.impl.LigneCommandeDAO;
import com.springapp.dao.dao.impl.PaletteDAO;
import com.springapp.model.StrDetailsPalette;
import com.springapp.model.Tache;
import com.springapp.service.IPaletteService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Created by Thomas on 02/09/14.
 */
@Service
public class PaletteService implements IPaletteService {
    @Autowired
    private PaletteDAO paletteDAO;
    @Autowired
    private LigneCommandeDAO ligneCommandeDAO;
    @Autowired
    private ListeTachesService lstTachesServices;
    @Autowired
    private SessionBean sessionBean;
    @Autowired
    private EmplacementDAO emplacementDAO;


    @Override
    public Hashtable<Integer, ArrayList<StrDetailsPalette>> htPalArtByCmd(String sRefCmd) {
        return paletteDAO.htPalArtByCmd(sRefCmd);
    }


    //Cette fonction traite du nombre de palettes completes à récupérer selon la quantité d'articles commandée
    @Override
    public Hashtable<Integer, ArrayList<StrDetailsPalette>> htIDNbArt(String sRefCmd, int seIDZonePrepa) {

       /*DANS MA 1ere HASHMAP Je trie ma liste par ordre croissant pour le nb d'article par fournisseur (avec 1 boucle)
        je parcours ma 1er ligne d'ID ARTICLE et pour chaque ligne de ma structure je fais un modulo.
        Je stocke la valeur retournée par modulo et je stocke également le nombre de palettes à commander.

        Ainsi la quantité de palettes de ce fournisseur est vide je passe à la suivante.
        si je trouve un modulo =0 je ne stocke pas et je passe à la ligne suivante jusqu'à ce que j'obtienne un nouveau modulo.
        Je dois stocker le nombre de palettes de chaque fournisseur et le total de palettes par fournisseur DANS UNE NOUVELLE HASHMAP.
        Lorsque j'ai fini de tout parcourir je n'ai plus qu'à retourner les nouvelles données de ma 1ERE HASHMAP MISE A JOUR.

        D'abord j'envoie les données de ma 2NDE HASHMAP pour la gestion des tâches pour les palettes completes.
        Ensuite je fabrique mon bon de préparation.
        Enfin j'affiche le bon de préparation contenant la liste des palettes complètes (1ere HASHMAP) et SURTOUT
        j'affiche les données pré remplies (valeurs par défaut dans un input box) et je laisse le choix au préparateur de valider sa commande.
        */

        SimpleDateFormat formater = null;
        SimpleDateFormat formater1 = null;

        Date aujourdhui = new Date();
        formater = new SimpleDateFormat("dd/MM/yyyy");
        formater1 = new SimpleDateFormat("hh:mm");


        //Je declare la HashMap contenant l'IDArticle, la structure de la palette pour chaque article de la commande
        Hashtable<Integer, ArrayList<StrDetailsPalette>> htPalette = new Hashtable<Integer, ArrayList<StrDetailsPalette>>();
        //Je déclare la HashMap contenant l'IDArticle et la quantité d'articles pour chaque article de la commande
        Hashtable<Integer, Integer> htQteArtByCmd = new Hashtable<Integer, Integer>();


        //Ces variables permettent de récupérer le nombre de palettes completes
        // et le nombre d'articles restant pour la constitution de palettes heterogenes

        int eNbPalettesZoneStock = 0;
        int eNbPalettesZoneStockRestantes = 0;

        int eNbArticlesParPalette = 0;
        int eNbArticlesCommandes = 0;


        int eNbPalettesChoisi = 0;
        int eNbPalettesChoisiTmp = 0;

        int eNbArticlesTraites = 0;

        int eQteTotaleArticle = 0;


        int eNbArticlesRestantTmp = 0;
        int eNbArticlesRestant = 0;

        ArrayList<Integer> lstMesArticles = ligneCommandeDAO.getlstIDarticle(sRefCmd);


        //je mets dans 1 HashMap ma HashMap de la structure palette
        htPalette = paletteDAO.htPalArtByCmd(sRefCmd);
        //je mets dans 1 HashMap ma HashMap de la ligne commande
        htQteArtByCmd = ligneCommandeDAO.htIDNbArt(sRefCmd);



        // for (int i = 0; i <= htPalette.size() - 1; i++) {
//        for(int  iIDArticle : lstMesArticles){
        int iCle;

        Set<Integer> set = htPalette.keySet();

        Iterator<Integer> itr = set.iterator();
        while (itr.hasNext()) {
            iCle = itr.next();
         /*  On compare avec les données: IDArticle, qteArticleCommmandee de la ligne commande:
             On boucle sur la seconde hashmap
             et pour les memes IDArticle on fait:

           */
            //   for (Map.Entry<Integer, ArrayList<StrDetailsPalette>> entry : htPalette.entrySet()) {
//            ArrayList<StrDetailsPalette> lstDetailsPalette = htPalette.remove(iCle);
            eNbArticlesCommandes = htQteArtByCmd.get(iCle);

            for (int i = 0; i <= htPalette.get(iCle).size() - 1; i++) {
                //je recupere la cle du tableau de la structure
                // traitements
                if (htQteArtByCmd.containsKey(iCle)) {
                    //                   eNbPalettesZoneStock = lstDetailsPalette.get(i).geteNbPaletteZoneStock();
                    eNbPalettesZoneStock = htPalette.get(iCle).get(i).geteNbPaletteZoneStock();
                    eNbArticlesParPalette = htPalette.get(iCle).get(i).geteNbArticleParPalette();



                    eQteTotaleArticle = htPalette.get(iCle).get(i).geteQteTotaleArticles();
                    eNbPalettesChoisi = htPalette.get(iCle).get(i).geteNbPalettesChoisies();
                    eNbArticlesTraites = htPalette.get(iCle).get(i).geteNbArticlesTraités();

                        /*
                        ->On calcule le nombre de palettes restant entre le nombre d'articles commandés et le nombre d'articles par palette
                        ->Si le nombre de palettes dans  la zone de stock n'est pas encore atteint on retranche le nombre de palette de stock
                        du nombre de palette choisi
                        ->On stocke le nombre de palette choisi
                        ->on reboucle jusqu'a ce qu'il n'y ait plus aucune palette (=0) dans la zone de stock

                         */

                    eNbPalettesChoisi = eNbArticlesCommandes / eNbArticlesParPalette; //Nb palettes completes de la zone stock casier
                    eNbPalettesChoisiTmp = eNbPalettesChoisi;

                    if (eNbPalettesChoisi < eNbPalettesZoneStock && eNbPalettesZoneStock > 0) {

                        //On additionne le nombre de palettes choisi et on retranche le nombre de palette en zone de stock casier
                        eNbPalettesZoneStock = eNbPalettesZoneStock - eNbPalettesChoisi;
                        eNbPalettesZoneStockRestantes = eNbPalettesZoneStock;


                        eNbArticlesCommandes = eNbArticlesCommandes - (eNbPalettesChoisi * eNbArticlesParPalette);

                        eNbArticlesTraites = eNbArticlesTraites + (eNbPalettesChoisi * eNbArticlesParPalette);


                    } else if (eNbPalettesChoisi > eNbPalettesZoneStock) {
                        eNbPalettesChoisi = eNbPalettesZoneStock;
                        eNbPalettesZoneStock = 0;
                        eNbArticlesCommandes = eNbArticlesCommandes - (eNbPalettesChoisi * eNbArticlesParPalette);

                        eNbArticlesTraites = eNbArticlesTraites + (eNbPalettesChoisi * eNbArticlesParPalette);

                    } else if (eNbPalettesZoneStock == 0) {

                        eNbPalettesChoisi = eNbPalettesZoneStock;
                        eNbPalettesZoneStock = 0;


                        eNbArticlesTraites = eNbArticlesTraites + (eNbPalettesChoisi * eNbArticlesParPalette);

                    }

                    //On ajoute les valeurs dans la hashmap
                    htPalette.get(iCle).get(i).seteNbPalettesChoisies(eNbPalettesChoisi);
                    htPalette.get(iCle).get(i).seteNbPaletteZoneStock(eNbPalettesZoneStock);

                    for (int j = 0; j <= htPalette.get(iCle).size() - 1; j++) {
                        htPalette.get(iCle).get(j).seteQteArticlesCommandes(eNbArticlesCommandes);
                        htPalette.get(iCle).get(j).seteNbArticlesTraités(eNbArticlesTraites);
                    }


                    //boucle pour ajouter les infos dans la tache
                    for (int j = 0; j <= htPalette.get(iCle).size() - 1; j++) {
                        String emp = "Allee" + emplacementDAO.getEmplacement(seIDZonePrepa).getiAllee() + "Rangee" + emplacementDAO.getEmplacement(seIDZonePrepa).getiRang();
                            if(htPalette.get(iCle).get(j).geteNbArticlesTraités()>0){
                            lstTachesServices.ajouteTache(new Tache(
                                    formater.format(aujourdhui),
                                    formater1.format(aujourdhui),
                                    emp,
                                    htPalette.get(iCle).get(j).getsEmplacementProduit(),
                                    htPalette.get(iCle).get(j).getsNomArticle(),
                                    htPalette.get(iCle).get(j).geteNbArticlesTraités(),
                                    1,
                                    0,
                                    "",
                                    new ArrayList(),
                                    htPalette.get(iCle).get(j).geteIDArtFou(),
                                    htPalette.get(iCle).get(j).geteIDEmplacement(),
                                    seIDZonePrepa,
                                    4
                            ));
                        }
                    }
                }

            }

        }// for


        //Cette fonction détermine le nombre restant d'articles commandé  pour les palettes heterogenes
//
//        public HashMap<Integer, Integer> htPalHeterogenesArtByCmd (String sRefCmd,int eNbArticlesrestant){
//          // HashMap<Integer, Integer> htQteArtByCmd = new HashMap<Integer, Integer>();
//            htQteArtByCmd = ligneCommandeDAO.htIDNbArt(sRefCmd);
//
//
//            return htQteArtByCmd;
//        }
        return htPalette;
    }

}


